ftell() not consistent in C11#8360
ftell() not consistent in C11#8360damorinCan wants to merge 3 commits intocppcheck-opensource:mainfrom
Conversation
|
Thanks for your contribution. |
|
Title now including reference to C11 and removed reference to Windows 11.
I added a test in test/testio.cpp. Anything missing in it ? |
Thanks, I must have missed that. |
|
Ping @danmar |
danmar
left a comment
There was a problem hiding this comment.
I feel we need to have a ticket for this in trac
it feels like it should be added to the release notes as a "new check" ?
| case Filepointer::Operation::UNIMPORTANT: | ||
| if (f.mode == OpenMode::CLOSED) | ||
| useClosedFileError(tok); | ||
| if (isftell && windows && f.read_mode == Filepointer::ReadMode::READ_TEXT && printPortability) |
There was a problem hiding this comment.
the error message says something about the C11 standard. Nothing about windows.
There was a problem hiding this comment.
I will add a comment about this reference to this Microsoft page:
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/ftell-ftelli64?view=msvc-170
An update for the error message with this, would it be OK ?
According to Microsoft, the value returned by ftell may not reflect the physical byte offset for streams opened in text mode, because text mode causes carriage return-line feed translation. See also 7.21.9.4 in C11 standard.".
I will remove the reference to _wfopen(), it's not part of the C++ standard.
There was a problem hiding this comment.
Sorry.. my confusion was because you wrote && windows &&.
Now that I understand the issue better I think it's better to be clear that it's a standard problem.
|
I have tried to add some descriptions about some of our checkers here: Ideally that would contain descriptions for all our checkers but due to lack-of-resources it does not. If you can add a corresponding file for this checking that would be great. |
- Fix the uncrustify check (removed https reference to Microsoft). New changes: - Added missing string related to new check - Added checker description for ftellTextModeFile - Updated copyright.
|
|
We need a ticket in trac for this. Can you please tell me what you think the summary and description should be and we can create it.. |
| @@ -0,0 +1,52 @@ | |||
| # ftellModeTextFile | |||
|
|
|||
| **Message**: According to Microsoft, the value returned by ftell may not reflect the physical byte offset for streams opened in text mode, because text mode causes carriage return-line feed translation. See also 7.21.9.4 in C11 standard.<br/> | |||
There was a problem hiding this comment.
It's not according to Microsoft. It's according to the C standard.
Sorry I was confused before.
I think it would make sense to quote the text from the C standard in the description in this document and highlight the part that says its file position indicator contains unspecified information.
The ftell function obtains the current value of the file position indicator for the stream
pointed to by stream. For a binary stream, the value is the number of characters from
the beginning of the file. For a text stream, its file position indicator contains unspecified
information, ...
| /* -*- C++ -*- | ||
| * Cppcheck - A tool for static C/C++ code analysis | ||
| * Copyright (C) 2007-2025 Cppcheck team. | ||
| * Copyright (C) 2007-2026 Cppcheck team. |
There was a problem hiding this comment.
this diff is not needed. we don't tweak it manually.
| " if (f)\n" | ||
| " {\n" | ||
| " fseek(f, 0, SEEK_END);\n" | ||
| " (void)ftell(f);\n" |
There was a problem hiding this comment.
I would think a warning here is a false positive. We can clearly see that nothing unexpected happens. The program will do what the developer expects. An assignment of an unknown or global variable pos = ftell(f); would make it more dangerous.
| if (f) | ||
| { | ||
| fseek(f, 0, SEEK_END); | ||
| printf( "Offset %d\n", ftell(f); |
There was a problem hiding this comment.
Could we make the example code more "buggy"? If the program writes the offset for debugging purposes this output might be 100% fine. If the program writes "File size: %d\n" instead it would be a bit more clear it's a bug imho. If you have better suggestions to make it more "buggy" feel free to do it..



Some legacy tools stopped suddenly working after 20+ years.
https://stackoverflow.com/questions/79762122/ftell-no-more-returning-the-correct-offset-on-a-text-file-with-windows-11-ente